﻿using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public class OrderEventArgs : EventArgs
{
    public string CoffeeName { get; set; }
    public string CoffeeSize { get; set; }
    public float CoffeePrice { get; set; }
}

//public delegate void OrderEventHandler(Customer _customer ,OrderEventArgs _eventArgs);//第一个事件的拥有者，第二个信息
public class EventEX : MonoBehaviour
{
    // 1事件的拥有者【类】
    // 2事件【event】
    // 3事件的响应者【类】
    // 4事件处理器【事件响应者的方法-受到约束】
    // 5事件订阅关系【+=】
    Customer customer = new Customer();
    Waiter waiter = new Waiter();
    private void Start()
    {

        //事件只能单个等号
        customer.Onorder += waiter.TakeAction;//可以注册很多事件响应事件
        customer.Order();
        
        customer.PayTheBill();
    }

}
public class Waiter
{
    //internal void TakeAction(Customer _customer, OrderEventArgs _eventArgs)
    //{
    //    float FinalPrice=0;
    //    switch (_eventArgs.CoffeeSize)
    //    {
    //        case "Tall":
    //            FinalPrice = _eventArgs.CoffeePrice;
    //            break;
    //        case "Grand":
    //            FinalPrice = _eventArgs.CoffeePrice + 3;
    //            break;
    //        case "Venti":
    //            FinalPrice = _eventArgs.CoffeePrice + 6;
    //            break;
    //    }
    //    _customer.Bill += FinalPrice;

    //}
    internal void TakeAction(object sender, EventArgs _eventArgs)
    {
        //1强制转换
        //2as
        //3 is  所以声明委托比较好
        //OrderEventArgs继承自eventargs 
        OrderEventArgs orderEventArgs = (OrderEventArgs)_eventArgs;
        Customer customer = (Customer)sender;
        float FinalPrice = 0;
        switch (orderEventArgs.CoffeeSize)
        {
            case "Tall":
                FinalPrice = orderEventArgs.CoffeePrice;
                break;
            case "Grand":
                FinalPrice = orderEventArgs.CoffeePrice + 3;
                break;
            case "Venti":
                FinalPrice = orderEventArgs.CoffeePrice + 6;
                break;
        }
        customer.Bill += FinalPrice;
    }
}
public class Customer//1
{
    public float Bill { get; set; }
    public void PayTheBill()
    {
        Debug.Log("顾客支付了" + this.Bill);
    }
    //如果不这样。系统自动生成委托来存方法，调用事件的时候其实就是调用委托
    //private OrderEventHandler orderEventHandler;//事件的委托存哪些方法，由注册决定，事件发生的时候调用委托存的所有方法；
    //2
    //public event OrderEventHandler Onorder {
    //    add
    //    {
    //        orderEventHandler += value;
    //    }
    //    remove
    //    {
    //        orderEventHandler -= value;
    //    }

    //}
    //去掉event关键字，别的对象点餐可以传另一个对象付钱，事件就不能在外面调用了，只能绑定,而且把委托藏到了后面，程序中不可见
    public event EventHandler Onorder;//哪种委托作为约束且存方法，绝对不是类型
    //order定义参数，这样别的类调用的时候可以简略代码
    public void  Order( )
    {
        if (Onorder != null)//语法糖衣，加深误会，事件绝对不是字段
        {
            OrderEventArgs orderEventArgs = new OrderEventArgs();
            orderEventArgs.CoffeeName = "Moka";
            orderEventArgs.CoffeeSize = "Tall";
            orderEventArgs.CoffeePrice = 28.0f;
            Onorder(this, orderEventArgs);
            Onorder(this, orderEventArgs);
        }
    }
    //属性包装字段，事件包装委托
    //属性保护字段不被滥用，事件保护委托不被滥用（封装性）
}
